###
# This file is a part of the NVDA project.
# URL: http://www.nvda-project.org/
# Copyright 2006-2010 NVDA contributers.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2.0, as published by
# the Free Software Foundation.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# This license can be found at:
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
###

# MSRPC tool
# Provides the MSRPCStubs builder which can use MIDL to generate header, client stub, and server stub files from an IDL.

from SCons import Util
from SCons.Builder import Builder


# This build emitter tells the builder that a header file, a client stub c file, and a server stub c file will be generated
def MSRPCStubs_buildEmitter(target, source, env):
	base, ext = Util.splitext(str(target[0] if len(target) > 0 else source[0]))
	newTargets = ["%s.h" % base]
	if not env["MSRPCStubs_noServer"]:
		newTargets.append("%s_S.c" % base)
	if not env["MSRPCStubs_noClient"]:
		newTargets.append("%s_C.c" % base)
	return (newTargets, source)


def MSRPCStubs_builder_actionGenerator(target, source, env, for_signature):
	sources = []
	for src in source:
		src = str(src)
		if src.endswith(".acf"):
			sources.append("/acf %s" % src)
		else:
			sources.append(src)
	sources = " ".join(sources)
	targets = []
	for tg in target:
		tg = str(tg)
		if tg.endswith(".h"):
			targets.append("/header %s" % tg)
		elif tg.endswith("_S.c"):
			targets.append("/sstub %s" % tg)
		elif tg.endswith("_C.c"):
			targets.append("/cstub %s" % tg)
		else:
			raise ValueError("Don't know what to do with %s" % tg)
	targets = " ".join(targets)
	noServer = "/server none" if env.get("MSRPCStubs_noServer", False) else ""
	noClient = "/client none" if env.get("MSRPCStubs_noClient", False) else ""

	prefix = env.get("MSRPCStubs_prefix", "")
	if prefix:
		prefix = "/prefix all %s" % prefix
	serverPrefix = env.get("MSRPCStubs_serverPrefix", "")
	if serverPrefix:
		serverPrefix = "/prefix server %s" % serverPrefix
	clientPrefix = env.get("MSRPCStubs_clientPrefix", "")
	if clientPrefix:
		clientPrefix = "/prefix client %s" % clientPrefix

	return " ".join(
		["${MIDL}", "${MIDLFLAGS}", noServer, noClient, prefix, serverPrefix, clientPrefix, targets, sources],
	)


MSRPCStubs_builder = Builder(
	generator=MSRPCStubs_builder_actionGenerator,
	src_suffix=[".idl", ".acf"],
	emitter=MSRPCStubs_buildEmitter,
)


def exists(env):
	from SCons.Tool import midl

	return midl.exists(env)


def generate(env):
	if "MIDL" not in env:
		from SCons.Tool import midl

		midl.generate(env)
	env["BUILDERS"]["MSRPCStubs"] = MSRPCStubs_builder
	env["MSRPCStubs_noServer"] = False
	env["MSRPCStubs_noClient"] = False
